#!/usr/bin/env python
# -*- coding: utf-8; -*-
import time
from django.shortcuts import render, HttpResponse, redirect
from django.http import JsonResponse
from django.conf import settings

from web import models
from web.forms.project import ProjectModelForm

from utils.tencent.cos import create_bucket


def project_list(request):
    """项目列表"""
    if request.method == 'GET':
        # GET请求返回项目列表
        """
        1. 从数据库获取：
                用户创建的项目：已星标、未星标
                用户参与的项目：已星标、未星标
        2. 对获取后的项目对象集合，提取已星标项目

        这样，我们就可以得到三个列表：星标、未星标的创建项目、未星标的参与项目
        """
        project_dict = {'star': [], 'my': [], 'join': []}

        my_projects = models.Project.objects.filter(
            creator=request.tracer.user)
        for row in my_projects:
            if row.star:
                # 为了分辨星标项目是否由当前登录用户创建,以字典的 type 为标记
                project_dict['star'].append({"value": row, 'type': 'my'})
            else:
                project_dict['my'].append(row)

        join_projects = models.ProjectUser.objects.filter(
            user=request.tracer.user)
        for item in join_projects:
            if item.star:
                # 注意，这里的 item 对应 ProjectUser 表，每一个 item 的
                # project 属性才是需要的项目对象
                project_dict['star'].append({
                    "value": item.project,
                    "type": 'join'
                })
            else:
                project_dict['join'].append(item.project)

        form = ProjectModelForm(request)

        return render(request, 'web/project_list.html', {
            'form': form,
            'project_dict': project_dict
        })

    # form.request 为 QuesySet 对象

    # 我们在 forms.ProjectModelForm 中重定义了 __init__ 方法，需要传递额外的
    # 位置参数 request，若指传入一个参数时，比如下面的语句
    # > form = ProjectModelForm(request.POST)
    # 会使得表单__init__方法的关键字参数 data 为空，表单的处理流程实际与
    # GET 方法，这时不会有表单校验，这就是每次发送空表单，而后台返回的
    # form.errors 为空的原因
    #
    # is_valid 方法的返回值依赖 is_bound 以及 self.errors, 只有
    # is_bound 为真，表单才会开始校验(调用 full_clean 方法)，查阅源码
    # >  self.is_bound = data is not None or files is not None
    #
    # 这里的 data 即表单接受的网络请求数据，显然data为空时is_bound为
    # 假，流程并未走到调用 form.errors(属性装饰器修饰) 那一步，所以之前
    # 忘记传递data关键字参数时新建项目表单不会触发清洗和校验操作
    form = ProjectModelForm(request, request.POST)
    if form.is_valid():
        # 1. 为新项目创建一个 cos 桶
        name = form.cleaned_data['name']
        bucket = "{}-{}-{}".format(
            # name.replace(" ", "-"),
            # 桶名称只可以包含数字字母和dash
            request.tracer.user.phone,
            str(int(time.time())),
            settings.TENCENT_COS_APPID)
        region = settings.TENCENT_COS_REGION
        create_bucket(bucket, region)

        # 2. 验证通过，应当向 project 表中填写下面的信息
        form.instance.creator = request.tracer.user
        form.instance.bucket = bucket
        form.instance.region = region

        instance = form.save()

        # 3.项目初始化问题类型
        issues_type_object_list = []
        # ["任务", '功能', 'Bug']
        for item in models.IssuesType.PROJECT_INIT_LIST:
            issues_type_object_list.append(
                models.IssuesType(project=instance, title=item))
        models.IssuesType.objects.bulk_create(issues_type_object_list)

        return JsonResponse({'status': True})

    return JsonResponse({'status': False, 'errors': form.errors})


def project_star(request, project_type, project_id):
    """ 星标项目 """
    # 更新 star 字段
    if project_type == 'my':
        # 查询语句中需要限制用户为项目的创建者,防止直接修改地址栏项目ID修改
        # 他人项目星标字段
        models.Project.objects.filter(
            id=project_id, creator=request.tracer.user).update(star=True)
        return redirect('project_list')

    if project_type == 'join':
        models.ProjectUser.objects.filter(
            project_id=project_id, user=request.tracer.user).update(star=True)
        return redirect('project_list')

    return HttpResponse('请求错误')


def project_unstar(request, project_type, project_id):
    """ 取消星标 """
    if project_type == "my":
        models.Project.objects.filter(
            id=project_id, creator=request.tracer.user).update(star=False)
        return redirect('project_list')

    if project_type == "join":
        models.Project.objects.filter(
            id=project_id, creator=request.tracer.user).update(star=False)
        return redirect('project_list')

    return HttpResponse('请求错误')
